﻿// Inner Fire 游戏引擎库
// LuaManager - LUA管理器
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 用于Lua的管理器
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-03-26

#pragma once

#include <klua.h>

namespace ifire::game {
class GameManager;

class LuaManager {

public:
  LuaManager(GameManager* gm);
  LuaManager(const LuaManager& lhs) = delete;
  LuaManager& operator=(const LuaManager& lhs) = delete;
  ~LuaManager();

  // 在一个Scene载入后执行
  void OnLoaded();
  // 在每个Scene的Update中执行
  void OnFixedUpdate();
  // 注册常用项目
  void RegisterGlobalFunction();

  // 处理KeyDown
  void OnKeyDown(int key);
  void OnKeyUp(int key);
  void OnChar(int c);
  void OnButtonClick(ikit::sstr button_id, int int_param, float float_param);
  // 处理鼠标移动的信息
  void OnMouseMove(int delta_x, int delta_y);
  // 处理鼠标点击的信息
  void OnMouseEvent(int mouse_button, int x, int y, bool is_pressed);
  // 处理Gamepad按钮的消息，event_id(0=按下,1=抬起）
  void OnGamepadButton(int button_id, int event_id);
  void OnLeftStick(float x, float y);
  void OnRightStick(float x, float y);

  // 打印一个调试信息
  void PrintDebug(int index, const char* text, size_t len);
  // 得到GM
  GameManager* GM() { return gm_; }

public:
  // ------
  // 全局功能
  // ------

  // 切换线框显示模式
  float SwitchWireMode();
  // 切换相机模式
  float SwitchCameraMode();
  // 设置相机模式。0=NORMAL，1=SPHERE
  float SetCameraMode(int type);
  // 锁定鼠标
  float LockCursor(bool enable);
  // 设置是否用户接管相机控制
  float SetCameraControlBySystem(bool enable);


private:
  GameManager* gm_;
  ikit::LuaEnv* lua_env_;
  lua_State* ls_;
  ikit::sstr init_func_;
  ikit::sstr fixed_update_func_;
  ikit::sstr key_down_func;
  ikit::sstr key_up_func;
  ikit::sstr char_func;


  // --------------------------------------------------------------------------
  // DEBUG:这里出现了一个非常诡异的BUG，在我原来的设计中，这里有一排ikit::sstr的字符串
  // 因为我在开始的时候对这些字符串进行初始化，不用每次都进行初始化，但我有一次增加了一个
  // mouse_move_func之后，程序居然出现内存错误。非常诡异，原因不明。
  // 报的错是CRT detected that the application worte to memory after end of heap buffer.
  // 这很明显是一个内存越界的错误。但我不明白问题发生在什么地方。
  // 这个是我在lua_get_userdata_no_check这个函数使用之后发生的，因为当时我使用了继承
  // metatable的功能。而这个继承功能是否导致内存问题，我没有办法查证。但可能就是这个问题。
  // --------------------------------------------------------------------------
};

void register_lua_animator(lua_State* L, LuaManager* lua_manager);
void register_lua_objects(lua_State* L, LuaManager* lua_manager);
void register_lua_assets(lua_State* L, LuaManager* lua_manager);
void register_lua_game_manager(lua_State* L, LuaManager* lua_manager);
void register_lua_ui(lua_State* L, LuaManager* lua_manager);
void register_lua_physics(lua_State* L, LuaManager* lua_manager);
void register_lua_graphics(lua_State* L, LuaManager* lua_manager);
void register_lua_controller(lua_State* L, LuaManager* lua_manager);

} // namespace ifire::game